export type FileSystemPermissionTransactionMode = 'read' | 'readwrite'
// export type FileSystemSyncAccessTransactionMode = 'read-only' | 'readwrite' | 'readwrite-unsafe'
// export type FileSystemWritableTransactionMode = 'exclusive' | 'siloed'


/**
 * @see https://developer.mozilla.org/zh-CN/docs/Web/API/FileSystemSyncAccessHandle
 */
// export interface FileSystemSyncAccessHandle {
//   /**
//    * 关闭一个打开的同步文件句柄，禁止之后对其的任何操作并且释放之前加在与文件句柄相关联的文件上的独占锁。
//    */
//   close(): void

//   /**
//    * 将通过 write() 方法对句柄相关联的文件所做的所有更改持久化保存到磁盘上。
//    */
//   flush(): void

//   /**
//    * 返回与句柄相关联文件的字节大小。
//    */
//   getSize(): number

//   /**
//    * 将与句柄相关联文件的内容读取到指定的缓冲区中，可选择在给定的偏移处开始读取。
//    * @returns 一个表示从文件读取的字节数的数字。
//    */
//   read<T extends ArrayBuffer | ArrayBufferView>(buffer: T, options?: { at: number }): number

//   /**
//    * 将与句柄相关联文件的大小调整为指定的字节数。
//    */
//   truncate(newSize: number): void

//   /**
//    * 将指定缓冲区中的内容写入到与句柄相关联的文件，可选择在给定的偏移处开始写入。
//    * @returns 一个表示写入到文件的字节数的数字。
//    */
//   write<T extends ArrayBuffer | ArrayBufferView>(buffer: T, options?: { at: number }): number
// }

export interface FileSystemCreateWritableOptions {
  mode?: 'exclusive' | 'siloed'
}

export interface FileSystemShowDirectoryPickerOptions {
  /**
   * 通过指定 ID，浏览器可以为不同的 ID 记住不同的目录。如果相同的 ID 用于另一个选择器，则该选择器将在同一目录中打开。
   */
  id?: string
  /**
   * 字符串，默认为 "read"，用于只读访问，或 "readwrite" 用于读写访问。
   */
  mode?: FileSystemPermissionTransactionMode
  /**
   * 一个 FileSystemHandle 对象或者代表某个众所周知的目录的字符串（如："desktop"、"documents"、"downloads"、"music"、"pictures"、"videos"），用于指定选择器的起始目录。
   */
  startIn?: string
}

export interface FileSystemWindow extends Window {
  /**
   * 显示一个目录选择器，以允许用户选择一个目录。
   */
  showDirectoryPicker(options?: FileSystemShowDirectoryPickerOptions): Promise<FileSystemDirectoryHandle>
}

